# -*- coding: UTF-8 -*-
from Tkinter import *
from PlancheDeJeu.VuePlancheDeJeu import *
from Chat.VueChat import *
from Philippe import *
import tkSimpleDialog as tks
from VueChoixMiniJeux import *
from ConstantesFrogger import *
try:
    from wPIL import Image, ImageTk, ImageOps
    import wPIL._imaging
    import wPIL._imagingtk
except ImportError:
    try:
        from PIL import Image, ImageTk, ImageOps
        import PIL._imaging
        import PIL._imagingtk
    except ImportError:
        import sys
        import tkMessageBox
        tkMessageBox.showwarning("Erreur", "S.V.P. Installez PIL Image et ImageTk pour jouer sur ce système d'exploitation")
        sys.exit()

class VueMenuPrincipal():
    pass

class Vue():
    def __init__(self, controleur, **params):
        size = params['size'] if 'size' in params.keys() else [ConstantesFrogger.DEFAULT_WIDTH,ConstantesFrogger.DEFAULT_HEIGHT]

        self.root = Tk()
        self.controleur = controleur

        self.root.geometry(str(size[0])+"x"+str(size[1]))
        self.root.protocol('WM_DELETE_WINDOW', controleur.quit)
        self.root.title("Frogger 3000")
        self.root.resizable(width=FALSE, height=FALSE)

        self.widthFrame = size[0]
        self.heightFrame = size[1]-250

        self.scores = VueStatutJoueurs(self.root,self.widthFrame,100)
        self.plancheDeJeu = VuePlancheDeJeu(self.root, controleur, self.widthFrame, self.heightFrame);
        self.plancheDeJeu.pack_propagate(0)
        self.chat = VueChat(self.root,self.widthFrame,200,controleur)
        self.chat.pack_propagate(False)
        
        self.scores.pack(side=TOP, fill=X)
        #self.plancheDeJeu.pack(side=TOP);
        self.chat.pack(side=BOTTOM, expand=1, fill=BOTH);
        
        self.frameActif = None
        self.tempFrame = None
        self.choixMiniJeux = None

    def show(self, frame):
        print 'show'
        self.tempFrame = frame
        if(self.frameActif and self.frameActif is self.plancheDeJeu):
            self.plancheDeJeu.pause()
        self.root.after(500, lambda  : self.frameSwitch()) #Ne pas le modifier directement d'un autre thread, tkinter n'aime pas!
        
    def frameSwitch2(self):
        try:
            print 'switch1#'
            #self.frameActif.pack_forget()
            if(self.frameActif is self.plancheDeJeu):
                print "mini"
                self.frameActif.config(width=1, height=1)
                self.plancheDeJeu.pack_propagate(0)
            else:
                print "unpacked"
                self.frameActif.pack_forget()
            print 'switch2#'
            #self.tempFrame.pack(side=TOP)
            if(self.tempFrame is self.plancheDeJeu):
                print "big"
                self.tempFrame.config(width=self.widthFrame, height=self.heightFrame)
                self.plancheDeJeu.pack_propagate(0)
            else:
                print "pack"
                self.tempFrame.pack(side=TOP)
            print 'switch3#'
            self.frameActif = self.tempFrame
        except:
            print "Exception dans Vue.py - frameSwitch"
            pass
            
    def frameSwitch(self):
        try:
            print 'switch1#'
            self.frameActif.pack_forget()
            print 'switch2#'
            self.tempFrame.pack(side=TOP)
            print 'switch3#'
            self.frameActif = self.tempFrame
            self.chat.champMessage.focus_set()
        except:
            print "Exception dans Vue.py - frameSwitch"
            pass
        
    def quit(self):
        self.plancheDeJeu.quit()
        self.root.quit()

    def afficherMenuPrincipal(self):
        VueMenuPrincipal();
    
    def afficherVuePrincipal(self):
        #if self.tempFrame:
        #    self.root.after(1, lambda  : self.tempFrame.pack_forget()) #Ne pas le modifier directement d'un autre thread, tkinter n'aime pas!
        if not self.frameActif:
            self.root.after(1, lambda  : self.plancheDeJeu.pack(side=TOP))
            self.frameActif = self.plancheDeJeu
            self.root.focus_force()
        else:
            self.show(self.plancheDeJeu)
        self.root.after(1, lambda  : self.plancheDeJeu.start());
        #self.root.after(1, lambda  : self.plancheDeJeu.pack(side=TOP)) #voir en haut
        #self.root.focus_force() #AJOUTTTTTT
        #self.frameActif = self.plancheDeJeu
        pass
    
    def afficherChat(self):
        self.chat.pack();
        
    def afficherMenuMiniJeu(self):
        #Creer le frame
        print "afficherMenuMiniJeu - Vue 1"
        self.choixMiniJeux = VueChoixMiniJeux(self.controleur, self.widthFrame, self.heightFrame, True)
        print "afficherMenuMiniJeu - Vue 2"
        self.show(self.choixMiniJeux)

    def afficherAttenteMiniJeu(self):
        self.choixMiniJeux = VueChoixMiniJeux(self.controleur, self.widthFrame, self.heightFrame, False)
        self.show(self.choixMiniJeux)

    def attendreDebutPartie(self):
        canvas = Canvas(self.root, width=self.widthFrame, height=self.heightFrame)
        
        canvas.pack(side="top")
        
        self.root.after(50, lambda  : self.checkIfReadyToStart(canvas))
    
    def checkIfReadyToStart(self, canvas):
        tuple = self.controleur.getJoueursDansPartie()
        
        #Afficher/Refresh le nbDeJoueur/nbJoueur
        canvas.delete('joueurs')
        canvas.create_text(self.widthFrame/2, self.heightFrame/2,text=str(tuple[0])+'/'+str(tuple[1]), font=('Helvetica', 30), tag='joueurs')
        
        if self.controleur.isPartieStarted():
            canvas.pack_forget()
            self.controleur.commencerPartie()
        else:
            self.root.after(100, lambda  : self.checkIfReadyToStart(canvas))
